package com.ww.book.javaconcurrencyinpractice.ch03;

import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * 集合相关的发布与逃逸问题
 */
public class CollectionEscape {
    private final Map<String, String> config = new HashMap<>();
    private final List<String> dataList = new CopyOnWriteArrayList<>();

    // 不安全的发布 - 内部状态逃逸
    public Map<String, String> getConfigUnsafe() {
        return config; // 直接返回内部引用
    }

    // 安全的发布 - 返回副本
    public Map<String, String> getConfigSafe() {
        return new HashMap<>(config); // 返回防御性副本
    }

    // 安全发布不可变视图
    public Map<String, String> getConfigReadOnly() {
        return Collections.unmodifiableMap(config);
    }

    public void initialize() {
        config.put("key1", "value1");
        config.put("key2", "value2");
    }

    // 线性安全的发布
    public void addData(String data) {
        dataList.add(data);
    }

    // 安全地获取数据快照
    public List<String> getDataSnapshot() {
        return new ArrayList<>(dataList);
    }

    public static void main(String[] args) {
        CollectionEscape escape = new CollectionEscape();
        escape.initialize();

        // 不安全的访问方式
        Map<String, String> unsafeConfig = escape.getConfigUnsafe();
        unsafeConfig.put("key3", "value3");

        // 安全的访问
        Map<String, String> safeConfig = escape.getConfigSafe();
        safeConfig.put("key4", "value4"); // 只是修改副本，不影响原对象

        Map<String, String> readOnlyConfig = escape.getConfigReadOnly();
        try {
            readOnlyConfig.put("key5", "value5");
        } catch (UnsupportedOperationException e) {
            System.out.println("只读视图不允许修改");
        }
    }
}
